#include <stdio.h>
#include <pthread.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>

//任务结构体
typedef struct Task
{
    void (*function)(void * arg); //函数指针
    void* arg;
}Task;

//线程池结构
typedef struct threadPool
{
    //任务队列
    Task* taskQ;
    int queCapcity; //队列容量
    int queSize; //当前任务个数
    int queFront; //队列头 取数据
    int queEnd; //队列尾 存数据

    pthread_t managerID;
    pthread_t* threadIDs;

    int minNum;     //最小线程数
    int maxNum;     //最大线程数
    int liveNum;    //存活线程数
    int busyNum;    //忙线程数
    int exitNum;    //要销毁线程数

    pthread_mutex_t mutePool; // 为线程池加锁
    pthread_mutex_t muteBusy; //锁busynum

    pthread_cond_t noFull; //条件变量 判满
    pthread_cond_t noEmpty; //条件变量 判空
    
    int showDown; //是否要销毁线程 1 销毁 0 不销毁

}threadPool;

//创建线程池
threadPool* createThreadPool(const int min, const int max, const int quesSize);
//销毁线程池
int destoryThreadPool(threadPool* pool);
//添加任务
void addTaskTOPool(threadPool* pool, void(*func)(void*), void* arg);
//获取工作的线程个数
int threadLiveNum(threadPool* pool);
//获取工作的busy的线程个数
int threadBusyNum(threadPool* pool);

void* manager(void* arg);
void* worker(void* arg);
void threadExit(threadPool* pool);
